#ifndef IMAGE_H
#define IMAGE_H


// 针对该结构体的字节对齐问题调整对齐策略
#pragma pack(push,1)
struct BMPFILEHEADER1
{
    unsigned short bfType;
    unsigned int   bfSize;
    unsigned short bfReserved1;
    unsigned short bfReserved2;
    unsigned int   bfOffBits;
};
#pragma pack(pop)

struct BITMAPINFOHEADER
{
    unsigned long    biSize;            //本结构所占用字节数 40字节
    long             biWidth;           //位图的宽度，以像素为单位
    long             biHeight;          //位图的高度，以像素为单位
    unsigned short   biPlanes;          //目标设备的级别，必须为1
    unsigned short   biBitCount;        //每个像素所需的位数，必须是1（双色）、
                                        //4（16色）、8（256色）或24（真彩色）之一
    unsigned long    biCompression;     //位图压缩类型，必须是 0（BI_RGB不压缩）、
                                        //1（BI_RLE8压缩类型）
                                        //2（BI_RLE压缩类型）之一
    unsigned long    biSizeImage;       //位图的大小，以字节为单位
    long             biXPelsPerMeter;   //位图水平分辨率，每米像素数
    long             biYPelsPerMeter;   //位图垂直分辨率，每米像素数
    unsigned long    biClrUsed;         //位图实际使用的颜色表中的颜色数
    unsigned long    biClrImportant;    //位图显示过程中重要的颜色数
};



class Image
{
public:
    void operator = (Image& m);//矩阵深拷贝
    void operator - ();//取反
    void gray2bw(double t);//二值化
    Image& operator ++();  //前置自加；
    Image& operator--();  //前置自减；
    Image operator++(int);  //后置自加；
    Image operator--(int);  //后置自减；

    int GetHeight()const { return height; }
    int GetWidth()const { return width; }
    unsigned char** Data()const {return data;  }
    unsigned char**& Data() {return data;}
    unsigned char GetData(int i, int j)const{ return  data[i][j];}

    void SetHeight(int h){height=h;}
    void SetWidth(int w){width=w;}
    void SetData(int h,int w,unsigned char ch){data[h][w]=ch;}

    void Onedimarr_to_twodinarr(const unsigned char* da);//一维数组转为二维数组
    void Twodimarr_to_onedinarr(const unsigned char* da);//将Image的二维数组data赋给一位数组da；
public:
    Image();
    Image(int h, int w);
    Image(int h, int w, unsigned char val);
    Image(const char* ImageName);
    Image(unsigned char m[][100], int n);
    Image(unsigned char** m, int h, int w);
    Image(Image& im);

    virtual ~Image();
    void del(int h, unsigned char*** d);//删除数组
    unsigned char** arr(int h, int w, unsigned char val = 0);//返回二级指针

    void ReadBMP(const char* ImageName);
    void WriteBMP(const char* ImageName);
    void ReadText(const char* Name);
    void WriteText(const char* Name);
    void Flip(int code);//翻转
    void Cut(int x1, int y1, int x2, int y2);//剪裁
    void Rotate(int degree);//旋转

    void ReadBMPre(const char* ImageName);//处理成灰度图像

    void mosaic(int x1, int y1, int x2, int y2);//马赛克
    unsigned char mean(int x, int y, int size);//返回边为size的正方形的均值
    unsigned char median(int x, int y, int size);//返回边为size的正方形的中值

    void compress(int pre);//图像压缩

    void sharpen();//图像锐化

    void MeanFilter(int size);//均值滤波函数
    void MedianFilter(int size);//中值滤波函数

    void ChangeRBG(int color, int value);//color的值0、1、2、3分别代表更改RBG、R、B.Gvalue是变化值

private:
    unsigned char** data;
    int height;
    int width;
    BMPFILEHEADER1 bmpfileheader;
    BITMAPINFOHEADER bitmapinfoheader;
};



#endif
